﻿using System;
using System.Windows;
using System.Windows.Input;
using System.Windows.Threading;
using SQDebugging;

namespace Quiz
{

     /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private AktuellesQuiz _aktQuiz;
        private DispatcherTimer _timer;

        #region Konstruktor
            /// <summary>
            /// Das Quiz selbst
            /// </summary>
            public MainWindow()
            {

                InitializeComponent();
              
                try
                {
                    //Initialisieren von FormControls
                    Init();
                    //z.b. Laden von bestimmten Kategorien für das Quiz
                    //_spielklasse.KategorieIDs.Add(1);

                }
                catch (Exception ex)
                {
                    //Bei Einer Exception im Mainwindow bzw. der Anwendung die Fehlermeldung ins Logfile schreiben
                    Debugging.WriteLog(ex);   
                }
            }


            /// <summary>
            /// Initialisieren der Formcontrols
            /// </summary>
            private void Init()
            {
                //Alle Einstellungen für den Vollbildmodus setzten
                SetFullScreenControls();

                _timer = new DispatcherTimer();
                _aktQuiz = new AktuellesQuiz();
                //Den DataContext für das aktuelle Quiz setzten.
                this.DataContext = _aktQuiz;

                //Initialiseren des Timers
                _timer.Tick += new EventHandler(dispatcherTimer_ZwischenZeit);
                _timer.Interval = new TimeSpan(0, 0, _aktQuiz.OptionAuswahl.AntwortzeitIndSekunden);
            }
        #endregion

        #region Functions/Subs
            /// <summary>
            /// Wenn sich die Anwendung im Vollbildmodus befindet, werden Einige Funktionen deaktiviert, bzw. angezeigt.
            /// </summary>
            private void SetFullScreenControls()
            {
                //WindowState="Maximized" WindowStyle="None" -> Müssen gesetzt werden für den Vollbildmodus
                if (this.WindowStyle == System.Windows.WindowStyle.None && this.WindowState == System.Windows.WindowState.Maximized)
                {
                    uxCloseBtn.Visibility = System.Windows.Visibility.Visible;
                }
                else
                {
                    //Den CloseButton nicht anzeigen wenn man nicht im Vollbildmodus ist.
                    uxCloseBtn.Visibility = System.Windows.Visibility.Collapsed;
                }
            }
       #endregion


       #region Events
            /// <summary>
            /// Der Closebutton um die Anwendung zu schließen
            /// </summary>
            private void uxCloseBtn_Click(object sender, RoutedEventArgs e)
            {
                this.Close();
            }

            /// <summary>
            /// Funktion um in den Vollbildmodus zu wechseln und zurück
            /// </summary>
            private void CommandBinding_Executed_FullScreen(object sender, ExecutedRoutedEventArgs e)
            {

                //string param = (string)e.Parameter;

                //WindowState="Maximized" WindowStyle="None" -> Müssen gesetzt werden für den Vollbildmodus
                if (this.WindowStyle == System.Windows.WindowStyle.None && this.WindowState == System.Windows.WindowState.Maximized)
                {
                    this.WindowState = System.Windows.WindowState.Normal;
                    this.WindowStyle = System.Windows.WindowStyle.SingleBorderWindow;
                }
                else
                {
                    this.WindowState = System.Windows.WindowState.Maximized;
                    this.WindowStyle = System.Windows.WindowStyle.None;
                }

                SetFullScreenControls();
            }

            private void CommandBinding_Executed_Number(object sender, ExecutedRoutedEventArgs e)
            {
                //Wenn der Zwischentimer noch nicht abgelaufen ist, dann kann auch keine nächste Frage ausgewählt werden.
                if (!_timer.IsEnabled && _aktQuiz.RestZeit > 0)
                {
                    int antwortID = int.MinValue;

                    //Überprüfen welcher Key gedrückt wurde.
                    if (Keyboard.IsKeyDown(Key.F1))
                    {
                        antwortID = 1;
                    }

                    if (Keyboard.IsKeyDown(Key.F2))
                    {
                        antwortID = 2;
                    }

                    if (Keyboard.IsKeyDown(Key.F3))
                    {
                        antwortID = 3;
                    }

                    if (Keyboard.IsKeyDown(Key.F4))
                    {
                        antwortID = 4;
                    }

                    if (Keyboard.IsKeyDown(Key.F5))
                    {
                        antwortID = 5;
                    }

                    if (Keyboard.IsKeyDown(Key.F6))
                    {
                        antwortID = 6;
                    }

                    if (Keyboard.IsKeyDown(Key.Escape))
                    {
                        uxStopBtn_Click(sender, e);
                        return;
                    }

                    _aktQuiz.FrageAntwortAuswertung(antwortID);
                    //Timer starten für die Zeit nach dem eine Frage beantwortet wurde.
                    _timer.Start();
                }

                e.Handled = true;
            }

            /// <summary>
            /// Der Timer für die Zwischenzeit wenn die Antworten angezeigt werden sollen
            /// </summary>
            private void dispatcherTimer_ZwischenZeit(object sender, EventArgs e)
            {
                if (_aktQuiz.RestZeit > 0)
                {
                    _timer.Stop();
                    _aktQuiz.NaechsteFrage(uxAntwortenListBox);
                }
            }

            /// <summary>
            /// Das Starten eines Quiz
            /// </summary>
            private void uxStartBtn_Click(object sender, RoutedEventArgs e)
            {
                //Wenn das Quiz abgebrochen wurde und mit neustarten neu gestartet wurde, dann den Timer erst noch einmal anhalten.
                _timer.Stop();

                //Beim Start eines Quiz wird erst überprüft, ob bereits der Vollbildmodus aktiviert wurde und wenn nicht, wird dieser eingeschalten.
                if (this.WindowStyle != System.Windows.WindowStyle.None && this.WindowState != System.Windows.WindowState.Maximized)
                {
                    this.WindowState = System.Windows.WindowState.Maximized;
                    this.WindowStyle = System.Windows.WindowStyle.None;
                    SetFullScreenControls();
                }

                _aktQuiz.QuizStarten();
                //Das aktuelle Spiel starten und in diesem Fall die Erste Frage aufrufen
                _aktQuiz.NaechsteFrage(uxAntwortenListBox);
            }

            /// <summary>
            /// Wird durch das Contextmenu des Fenstern aufgerufen und Zeigt alle Fragen in einer Liste an.
            /// Die Fragen können Hier Hinzugefügt, gelöscht und bearbeitet werden.
            /// </summary>
            private void uxListeanzeigen_Click(object sender, RoutedEventArgs e)
            {
                FrageListe frageliste = new FrageListe();
                frageliste.Closed += new EventHandler(listenAnzeige_Close);
                frageliste.ShowDialog();
            }

            /// <summary>
            /// Hinzufügen einer Neuen Frage direkt aus dem Contextmenü aufrufen
            /// </summary>
            private void uxFrageHinzufuegen_Click(object sender, RoutedEventArgs e)
            {
                FrageHinzufuegen frageHinzufuegen = new FrageHinzufuegen();
                frageHinzufuegen.Closed += new EventHandler(listenAnzeige_Close);
                frageHinzufuegen.ShowDialog();
            }

            /// <summary>
            /// Importieren von Fragen aus einer Excel datei
            /// </summary>
            private void uxFragenImportieren_Click(object sender, RoutedEventArgs e)
            {
                //Openfiledialog einbauen um das Excel File auszulesen, in dem die gewünschten Daten stehen die importiert werden sollen.
                System.Windows.Forms.OpenFileDialog openDialog = new System.Windows.Forms.OpenFileDialog();
                openDialog.Filter = "Excel 2007 (*.xlsx)|*.xlsx|Excel-Dateien (*.xls)|*.xls";
                System.Windows.Forms.DialogResult objResult = openDialog.ShowDialog();

                //Wenn eine Datei ausgeählt wurde, dann den Importporzess starten.
                if (objResult == System.Windows.Forms.DialogResult.OK)
                {
                    DataBase db = new DataBase();
                    if (db.FragenImportieren(openDialog.FileName))
                    {
                        MessageBox.Show("Der Import der Fragen war erfolgreich");
                        db.Dispose();
                        Init();
                    }
                    else
                    {
                        MessageBox.Show("Beim Import der Daten ist ein Fehler aufgetreten, bitte prüfen Sie ob sich die Daten auch im Excel-Sheet mit dem Namen \"Tabelle1\" befinden. \\n Es wird nur xlsx von Office 2007 unterstützt oder das xls Format von Office 2003.");
                    }
                }

                openDialog.Dispose();
            }

            /// <summary>
            /// Die QuizOptionen anzeigen lassen, damit diese bearbeitet werden können.
            /// </summary>
            private void uxQuizOptionenAnzeigen_Click(object sender, RoutedEventArgs e)
            {
                QuizOptionen optionen = new QuizOptionen();
                optionen.Closed += new EventHandler(listenAnzeige_Close);
                optionen.ShowDialog();
            }

            /// <summary>
            /// Wenn die Frageliste geschlossen wird, dann wird diese Funktion aufgerufen um evtl. die Frageliste "neu" zu erstellen, ...
            /// </summary>
            private void listenAnzeige_Close(object sender, EventArgs e)
            {
                Init();
            }

            /// <summary>
            /// Beenden eines Quiz
            /// </summary>
            private void uxStopBtn_Click(object sender, RoutedEventArgs e)
            {
                _timer.Stop();
                _aktQuiz.QuizBeenden();
            }
        #endregion  
        
         
    }
}
